package com.example.airhockeytextured.helper

import android.content.Context
import android.graphics.BitmapFactory
import android.opengl.GLES20.*
import android.opengl.GLUtils
import android.util.Log
import com.example.airhockeytextured.utils.LoggerConfig

/**
 * @author Liujianyou
 * @date 2020/7/27
 * @des
 */
object TexturedHelper {
    private const val TAG = "TexturedHelper"
    fun loadTextured(context: Context, resId: Int): Int {
        val textureObjectsIds = IntArray(1)
        /*通过传递1作为第一个参数调用glGentextureds我们就创建了一个纹理对象，
         *OpenGL会把那个生成的id存储在textureObjectsIds中。
         * */
        glGenTextures(1, textureObjectsIds, 0)
        //检查glGentextureds这个方法是否调用成功
        if (textureObjectsIds[0] == 0) {
            if (LoggerConfig.ON) {
                Log.w(TAG, "Could not generate a new OpenGL texture object ")
            }
            return 0
        }

        val options: BitmapFactory.Options = BitmapFactory.Options()
        options.inScaled = false
        /*调用BitmapFactory.decodeResource 做实际的解码工作，
        将我们刚刚定义的上下文，资源id，和解码的options传入
        这个调用会把解码后的图像存入bitmap
        */
        val bitmap = BitmapFactory.decodeResource(
            context.resources,
            resId,
            options
        )
        /*如果bitmap为空值，就将之前创建的openGL纹理对象删除*/
        if (bitmap == null) {
            if (LoggerConfig.ON) {
                Log.w(TAG, "Resource ID : " + resId + "Could not ne decoded .")
            }

            glDeleteTextures(1, textureObjectsIds, 0)

            return 0
        }
        /*//如果bitmap不为空
        ，在可以使用这个新生成的纹理对象之前，
        我们需要告诉OpenGL后面的纹理调用应该应用于这个纹理对象
        为此需要使用一个glBindTextured调用
        第一个参数告诉OpenGL这个应该被作为二维纹理对待，第二个参数告诉要绑定的额纹理对象id
        */
        glBindTexture(GL_TEXTURE_2D, textureObjectsIds[0])

        /*用一个glTexParameteri()调用设置每个过滤器 GL_TEXTURE_MIN_FILTER是指缩小的情况
        * GL_TEXTURE_MAG_FILTER指放大的情况，对于缩小的情况 ，使用三线性过滤GL_LINEAR_MIPMAP_LINEAR
        * 对于放大的情况 ，使用双线性过滤GL_LINEAR
        */
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

        /*调用texImage2D方法加载位图到OpenGL里
        * 这个调用告诉OpenGL读入bitmap定义的位图数据，并将它复制到当前绑定的纹理对象
        * */
        GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0)
        bitmap.recycle()
        /*调用管理GenerateMipmap 生成所有必要级别的MIP贴图*/
        glGenerateMipmap(GL_TEXTURE_2D);

        /*到这一步的时候已经完成了纹理的加载，我们需要解决当前纹理的绑定，
        防止其他纹理方法改变当前纹理对象
        传递0给glBindTexture就与当前纹理解除绑定了
        最后一步是返回我们生成好了的纹理对象Id
        */
        glBindTexture(GL_TEXTURE_2D, 0)
        return textureObjectsIds[0]
    }
}